#include "stm32f10x.h"
#include "Delay.h"
#include "LED.h"
#include "Key.h"
#include "Sensor.h"
#include "OLED.h"
#include "CountSensor.h"


/**
操作pc13灯打开/关闭
1 open
other  close
*/
void led(int i);

//打开所有led灯
void openAllLed(void);

//闪烁led
void blinkLed(void);

//打开蜂鸣器
void openBuzzer(void);

//关闭蜂鸣器
void stopBuzzer(void);

//初始化蜂鸣器
void initBuzzer(void);

//监测灯光
void monitorLight(void);

//测试oled屏幕
void test_oled(void);

//通过红外传感器记录次数，并调用蜂鸣器
void recordCount(void);

//通过旋转按钮记录次数，并调用蜂鸣器
void rotateCount(void);

int main(void){
	rotateCount();
	//recordCount();
//	blinkLed();
//	test_oled();
//	monitorLight();
//	key_init(RCC_APB2Periph_GPIOB,GPIOB,GPIO_Pin_1|GPIO_Pin_11);
//	while(1){
//		int key = key_read();
//		if(key == 11){
//			blinkLed();
//		}else if(key == 1){
//			initBuzzer();
//			openBuzzer();
//		}
//	}
	//led(1);
	//openBuzzer();
	//blinkLed();
	//openAllLed();
}

void test_oled(void){
	OLED_Init();
	OLED_ShowChar(1,1,'A');
	OLED_ShowChar(1,3,'B');
	OLED_ShowString(2,1,"Are u ok?");
}

void monitorLight(void){
	sensor_init(RCC_APB2Periph_GPIOA,GPIOA,GPIO_Pin_8);
	initBuzzer();
	while(1){
		if(read_sensor_level() == 0){
			openBuzzer();
		}else{
			stopBuzzer();
		}
	}
}


void blinkLed(void){
	led_init(RCC_APB2Periph_GPIOA,GPIOA,0x0001|0x001<<3);
	while(1){
		GPIO_Write(GPIOA,~0x0001);
		Delay_ms(300);
		GPIO_Write(GPIOA,~(0x0001<<3));
		Delay_ms(300);
	}
}


void openAllLed(void){
	led_init(RCC_APB2Periph_GPIOA,GPIOA,0x0001|0x0004|0x0010|0x0040);
	GPIO_ResetBits(GPIOA,0x0001|0x0004|0x0010|0x0040);
}


void led(int i){
	//基于寄存器的方式操作灯，这种方式需要查芯片对应文档，但是性能嘎嘎
	//RCC->APB2ENR = 0x00000010;
	//GPIOC->CRH = 0x00300000;
	//GPIOC->ODR = 0x00002000;
	led_init(RCC_APB2Periph_GPIOC,GPIOC,GPIO_Pin_13);
	if(i){
		GPIO_ResetBits(GPIOC,GPIO_Pin_13); //低电平
	}else{
		GPIO_SetBits(GPIOC,GPIO_Pin_13); //高电平
	}
}


void initBuzzer(void){
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	//配置GPIO结构体
	GPIO_InitTypeDef type;
	type.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
	type.GPIO_Pin = GPIO_Pin_12; 
	type.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&type);
}

void openBuzzer(void){
	  GPIO_ResetBits(GPIOB,GPIO_Pin_12); //高电平
}

void stopBuzzer(void){
		GPIO_SetBits(GPIOB,GPIO_Pin_12); //高电平
}

void recordCount(void){
	count_sensor_init();
	initBuzzer();
	OLED_Init();
	OLED_ShowString(1,1,"count:");
	while(1){
		int16_t count = getCount();
		OLED_ShowNum(2,1,count,5);
		if(count!=0 && count % 10 == 0) {
			openBuzzer();
		}else{
			stopBuzzer();
		}

	}
}


void rotateCount(void){
	rotate_sensor_init();
	initBuzzer();
	OLED_Init();
	OLED_ShowString(1,1,"count:");
	while(1){
		int16_t count = getCount();
		OLED_ShowSignedNum(2,1,count,5);
		if(count!=0 && count % 10 == 0) {
			openBuzzer();
		}else{
			stopBuzzer();
		}

	}
}



